package com.squareup.timessquare;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 * 对公历日期的处理类
 * User: zhouxin@easier.cn
 * Date: --
 * Time: 下午4:06
 * To change this template use File | Settings | File Templates.
 */
public class CalendarUtil {
	 /**
     * 用于保存中文的月份
     */
//    private final static String CHINESE_NUMBER[] = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"};

    /**
     * 用于保存展示周几使用
     */
//    private final static String WEEK_NUMBER[] = {"日", "一", "二", "三", "四", "五", "六"};

    /**
     * 转换为2012年11月22日格式
     */
    private static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
            "yyyy年MM月dd日");
    /**
     * 转换为2012-11-22格式
     */
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
            "yyyy-MM-dd");
    private final static long[] LUNAR_INFO = new long[]{0x04bd8, 0x04ae0, 0x0a570,
            0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
            0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0,
            0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50,
            0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566,
            0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0,
            0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4,
            0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550,
            0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950,
            0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260,
            0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0,
            0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
            0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40,
            0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3,
            0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960,
            0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0,
            0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9,
            0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0,
            0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65,
            0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0,
            0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
            0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0};

 

    /**
     * 计算得到农历的年份
     */
    private static int mLuchYear;
    /**
     * 计算得到农历的月份
     */
    private static int mLuchMonth;

    /**
     * 计算得到农历的日期
     */
    private static int mLuchDay;

    /**
     * 用于标识是事为闰年
     */
    private static boolean isLoap;

    /**
     * 用于记录当前处理的时间
     */
//    private static Calendar mCurrenCalendar;
    private final static String[][] GRE_FESTVIAL = {
            //一月
            {"元旦", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    ""},
            //二月
            {"", "", "", "", "", "", "", "", "", "", "", "", "", "情人", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", ""},
            //三月
            {"", "", "", "", "", "", "", "妇女", "", "", "", "植树", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //四月
            {"愚人", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //五月
            {"劳动", "", "", "青年", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", "无烟"},
            //六月
            {"儿童", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //七月
            {"建党", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //八月
            {"建军", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //九月
            {"", "", "", "", "", "", "", "", "", "教师", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //十月
            {"国庆", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //十一月
            {"", "", "", "", "", "", "", "", "", "", "光棍", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", "", "", "", "", ""},
            //十二月
            {"艾滋病", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "圣诞", "", "", "", "", "", ""},
    };
    private static int mMonth;
    private static int mDay;
 

    public static String getGremessage(Calendar calendar) {
//    	Calendar calendar=Calendar.getInstance();
//    	calendar.setTime(date);
    	mMonth = calendar.get(Calendar.MONTH);
        mDay = calendar.get(Calendar.DATE);
        String jjr= GRE_FESTVIAL[mMonth][mDay - 1];
        if (jjr.equals("")) {
        	  init(calendar);
//              computeSolarTerms();
        	 jjr = getChinaCalendarMsg(mLuchYear, mLuchMonth, mLuchDay);
//              jjr = getSolartermsMsg();
		}
        return jjr;
    }

private static void init(Calendar cal) {
	 int yearCyl, monCyl, dayCyl;
   
     int leapMonth = 0;
     Date baseDate = null;
     try {
         baseDate = chineseDateFormat.parse("1900年1月31日");
     } catch (ParseException e) {
         e.printStackTrace(); // To change body of catch statement use
         // Options | File Templates.
     }

     // 求出和1900年1月31日相差的天数
     int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
     dayCyl = offset + 40;
     monCyl = 14;

     // 用offset减去每农历年的天数
     // 计算当天是农历第几天
     // i最终结果是农历的年份
     // offset是当年的第几天
     int iYear, daysOfYear = 0;
     for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {
         daysOfYear = yearDays(iYear);
         offset -= daysOfYear;
         monCyl += 12;
     }
     if (offset < 0) {
         offset += daysOfYear;
         iYear--;
         monCyl -= 12;
     }
     // 农历年份
     mLuchYear = iYear;

     yearCyl = iYear - 1864;
     leapMonth = leapMonth(iYear); // 闰哪个月,1-12
     isLoap = false;

     // 用当年的天数offset,逐个减去每月（农历）的天数，求出当天是本月的第几天
     int iMonth, daysOfMonth = 0;
     for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
         // 闰月
         if (leapMonth > 0 && iMonth == (leapMonth + 1) && !isLoap) {
             --iMonth;
             isLoap = true;
             daysOfMonth = leapDays(mLuchYear);
         } else
             daysOfMonth = monthDays(mLuchYear, iMonth);

         offset -= daysOfMonth;
         // 解除闰月
         if (isLoap && iMonth == (leapMonth + 1))
             isLoap = false;
         if (!isLoap)
             monCyl++;
     }
     // offset为0时，并且刚才计算的月份是闰月，要校正
     if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
         if (isLoap) {
             isLoap = false;
         } else {
             isLoap = true;
             --iMonth;
             --monCyl;
         }
     }
     // offset小于0时，也要校正
     if (offset < 0) {
         offset += daysOfMonth;
         --iMonth;
         --monCyl;

     }
     mLuchMonth = iMonth;
     mLuchDay = offset + 1;

}
/**
 * 用于获取中国的传统节日
 *
 * @param month 农历的月
 * @param day   农历日
 * @return 中国传统节日
 */
private static String getChinaCalendarMsg(int year, int month, int day) {
    String message = "";
    if (((month) == 1) && day == 1) {
        message = "春节";
    } else if (((month) == 1) && day == 15) {
        message = "元宵";
    } else if (((month) == 5) && day == 5) {
        message = "端午";
    } else if ((month == 7) && day == 7) {
        message = "七夕";
    } else if (((month) == 8) && day == 15) {
        message = "中秋";
    } else if ((month == 9) && day == 9) {
        message = "重阳";
    } else if ((month == 12) && day == 8) {
        message = "腊八";
    } else {
        if (month == 12) {
            if ((((monthDays(year, month) == 29) && day == 29)) || ((((monthDays(year, month) == 30) && day == 30)))) {
                message = "除夕";
            }
        }
    }
    return message;
}
/**
 * 传回农历 year年month月的总天数
 *
 * @param year  将要计算的年份
 * @param month 将要计算的月份
 * @return 传回农历 year年month月的总天数
 */
private static int monthDays(int year, int month) {
    if ((LUNAR_INFO[year - 1900] & (0x10000 >> month)) == 0)
        return 29;
    else
        return 30;
}
/**
 * 传回农历 year年的总天数
 *
 * @param year 将要计算的年份
 * @return 返回传入年份的总天数
 */
private static int yearDays(int year) {
    int i, sum = 348;
    for (i = 0x8000; i > 0x8; i >>= 1) {
        if ((LUNAR_INFO[year - 1900] & i) != 0)
            sum += 1;
    }
    return (sum + leapDays(year));
}

/**
 * 传回农历 year年闰月的天数
 *
 * @param year 将要计算的年份
 * @return 返回 农历 year年闰月的天数
 */
private static int leapDays(int year) {
    if (leapMonth(year) != 0) {
        if ((LUNAR_INFO[year - 1900] & 0x10000) != 0)
            return 30;
        else
            return 29;
    } else
        return 0;
}

/**
 * 传回农历 year年闰哪个月 1-12 , 没闰传回 0
 *
 * @param year 将要计算的年份
 * @return 传回农历 year年闰哪个月 1-12 , 没闰传回 0
 */
private static int leapMonth(int year) {
    return (int) (LUNAR_INFO[year - 1900] & 0xf);
}
}
